Processor integrated circuit (IC) manufacturers have shifted from increasing processor clock frequency to increase performance to instead increasing the number of processors within a given IC or chip to increase performance. Currently chips with four or eight processor “cores” are widely available. It is expected that in the future, chips that have tens of processor cores will become available, and possibly hundreds or thousands of processor cores, to increase performance.
Multiple-core processor chips are advantageously employed by computer programs that have multiple threads. Generally and non-restrictively, a multiple threaded-computer program means that multitasking occurs within the program. Multithreading allows multiple streams of execution to take place concurrently within the same computer program. However, while multiple threads of a computer program may be able to be substantially executed independently and in parallel with one another by different cores, this is not always the case all the time. Often different threads may have to have their execution synchronized with one another. Furthermore, they may share the same data.
Assigning the threads of a computer program to processor cores for optimal execution of the computer program has thus proven difficult to achieve without manually programming each computer program for a given multiple-core architecture. Such disadvantages are exacerbated in the relatively typical situation in which different processor cores have access to different memory within a given multiple-core processor chip. In such instance, the cores are heterogeneous, and it can be important to assign different threads to particular cores that may share memory with other particular cores. (Heterogeneous cores can additionally or alternatively have different clock frequencies and micro-architectures.)